import java.util.ArrayList;

/**
 * Classe representant un job
 */
public class Job implements Cloneable {

	/** Liste des taches de ce job */
	private ArrayList<Tache> listeTaches;
	/**
	 * Indice de la "tache suivante", c'est a dire de la prochaine tache a
	 * placer dans ce job
	 */
	private int tacheSuivante;
	/** id du job */
	private int idJob;

	/**
	 * Constructeur
	 */
	public Job(int id) {
		// Init de la liste
		this.listeTaches = new ArrayList<Tache>();
		// La prochaine tache a placer est la premiere
		this.tacheSuivante = 0;
		this.idJob = id;
	}
	
	public String toString() {
		return "Job " + idJob;
	}

	public int getId() {
		return this.idJob;
	}

	/**
	 * Getter de la liste des taches
	 * 
	 * @return la liste des taches
	 */
	public ArrayList<Tache> getListeTaches() {
		return listeTaches;
	}

	/**
	 * Fonction permettant d'ajouter une tache, c'est aussi elle qui fixe la
	 * date min de chaque tache en fonction de la tache precedente
	 * 
	 * @param tache
	 *            la tache a ajouter
	 */
	public void ajouterTache(Tache tache) {
		listeTaches.add(tache);

		// Si la liste contenait un element avant cette tache :
		if (listeTaches.size() > 1) {
			// Alors on peut calculer une date min plus precise pour la nouvelle
			// tache, c'est la date min de la precedente + la duree de la
			// precedente
			Tache tachePrecedente = listeTaches.get(listeTaches.size() - 2);

			tache.setDateMin(tachePrecedente.getDateMin()
					+ tachePrecedente.getDuree());
		}
	}

	/**
	 * Getter de la tache suivante.
	 * 
	 * @return La tache suivante ou null s'il n'en reste plus
	 */
	public Tache getTacheSuivante() {
		if (tacheSuivante == listeTaches.size()) {
			return null;
		}
		return listeTaches.get(tacheSuivante);
	}

	/**
	 * Fonction permettant de demander au job de passer a la suivante
	 * "tache suivante"
	 */
	public void passageTacheSuivante() {
		this.tacheSuivante++;
	}

	@Override
	protected Job clone() throws CloneNotSupportedException {
		Job clone = new Job(this.idJob);
		for (Tache tache : this.listeTaches) {
			Tache tacheClone = new Tache(tache.toString(), tache.getOrdre(), tache.getDuree(), tache.getRessource(), clone);
			tacheClone.setDateMin(Integer.MAX_VALUE);
			clone.getListeTaches().add(tacheClone);
		}
		clone.getListeTaches().get(0).setDateMin(0);
		return clone;
	}
}
